# 参数：数据宽度data_width、数据深度data_depth、en默认1？
# 先只用ramb18e1，也就是width最大16，depth 1k？
# INIT_00到INIT_3F，每个256位,16进制

# yosys好像不支持reg的input output，只支持wire类型


class RomIP:
    ram_mode="TDP"
    port_clk:PortItem = None
    port_en:PortItem = None
    port_addr:PortItem = None
    port_dout:PortItem = None
    def __init__(self,data_width:int=4, data_depth:int=2, module_name="rom_ip") -> None:
        self.data_width = data_width
        self.data_depth = data_depth
        self.module_name = module_name
        pass

    def get_inits(self):
        total_mem = self.data_depth*self.data_width
    def set_init_value(self,init_values:str):
        # 16进制,低位在右边
        self
        pass

    
    def write_verilog(self) -> str:
        sb = ""
        sb += "module {}(\n".format(self.module_name)
        sb += "\t{} {} {},\n".format(self.port_clk.type,self.port_clk.get_width_str(),self.port_clk.name)
        sb += "\t{} {} {},\n".format(self.port_en.type,self.port_en.get_width_str(),self.port_en.name)
        sb += "\t{} {} {},\n".format(self.port_addr.type,self.port_addr.get_width_str(),self.port_addr.name)
        sb += "\t{} {} {}\n);\n".format(self.port_dout.type,self.port_dout.get_width_str(),self.port_dout.name)

        # ramb18e1
        sb += "\tRAMB18E1 #("
        sb += "\t\t.RAM_MODE(\"{}\"),".format(self.ram_mode)
        sb += "\t\t.READ_WIDTH_A({}),".format(self.data_depth)


        sb+= "\nendmodule"
        return sb




if __name__ == "__main__":
    rom_ip_inst = RomIP()
    rom_ip_inst.port_clk=PortItem(name="clk")
    rom_ip_inst.port_addr=PortItem(name="addr",width=4)
    rom_ip_inst.port_en=PortItem(name="en")
    rom_ip_inst.port_dout=PortItem(name="dout",width=4)

    s = rom_ip_inst.write_verilog()
    with open("out.v",'w') as f:
        f.write(s)